///*
// * To change this template, choose Tools | Templates
// * and open the template in the editor.
// */
//package candidate.beans;
//
//import imageProcessing.classes.GeneralBufferedImageMaker;
//import ProcesamientoImagenes.interfaces.BufferedImageMaker;
//import util.ImageStoreHelper;
//import util.PrimeFacesBufferedImage;
//import java.awt.Graphics;
//import java.awt.Graphics2D;
//import java.awt.RenderingHints;
//import java.awt.image.BufferedImage;
//import java.io.IOException;
//import java.io.Serializable;
//import java.net.URISyntaxException;
//import java.util.LinkedList;
//import java.util.List;
//import javax.enterprise.context.SessionScoped;
//import javax.enterprise.event.Observes;
//import javax.faces.context.FacesContext;
//import javax.inject.Named;
//import org.primefaces.event.FileUploadEvent;
//import org.primefaces.model.DefaultStreamedContent;
//import org.primefaces.model.StreamedContent;
//import org.primefaces.model.UploadedFile;
//import candidate.qualifiers.UpdatedImagesEvent;
//
///**
// *
// * @author damfercer
// */
//@Named
//@SessionScoped
//public class EditImageBean implements Serializable {
//    
//private UploadedFile originalImageFile;
//private PrimeFacesBufferedImage originalImage;
//private PrimeFacesBufferedImage originalImageResized;
//private PrimeFacesBufferedImage bustCroppedImage;
//private PrimeFacesBufferedImage bodyCroppedImage;
//
////Cambio a almacenar las imagenes temporales
//private String originalImageFileName;
//
//private List<PrimeFacesBufferedImage> resultImages;
//private List<Long> resultImagesIdentifiers;
//
//private List<PrimeFacesBufferedImage> bodyResultImages;
//private List<Long> bodyResultImagesIdentifiers;
////Cropping fields
//private Integer x1;
//private Integer y1;
//private Integer x2;
//private Integer y2;
//private Integer cropWidth;
//private Integer cropHeight;
//
//private final Integer maxBustSize=350;
//private final Integer maxBodySize=500;
//
////Chosen Images to save to File system
//private PrimeFacesBufferedImage chosenBustImage;
//private PrimeFacesBufferedImage chosenBodyImage;
//
//    /**
//     * Creates a new instance of imageBean
//     */
//    public EditImageBean() {
//        resultImages=new LinkedList<PrimeFacesBufferedImage>();
//        resultImagesIdentifiers=new LinkedList<Long>();
//        bodyResultImages=new LinkedList<PrimeFacesBufferedImage>();
//        bodyResultImagesIdentifiers=new LinkedList<Long>(); 
//    }
//    
//    public void onUpdatedImages(@Observes @UpdatedImagesEvent Integer event){
//        reinitEditImageBean();
//    }
//   
//    public void reinitEditImageBean(){
//        x1=null;
//        y1=null;
//        x2=null;
//        y2=null;
//        cropWidth=null;
//        cropHeight=null;
//        originalImage=null;
//        originalImageResized=null;
//        bustCroppedImage=null;
//        bodyCroppedImage=null;
//        resultImages=new LinkedList<PrimeFacesBufferedImage>();
//        resultImagesIdentifiers=new LinkedList<Long>();
//        bodyResultImages=new LinkedList<PrimeFacesBufferedImage>();
//        bodyResultImagesIdentifiers=new LinkedList<Long>(); 
//        chosenBustImage=null;
//        chosenBodyImage=null;
//        originalImageFileName=null;
//    }
//    
//    public void processOriginalImageFile(FileUploadEvent event) throws IOException{ 
//        originalImageFileName=null;
//        originalImage=null;
//        originalImageResized=null;
//        bustCroppedImage=null;
//        bodyCroppedImage=null;
//        resultImages=new LinkedList<PrimeFacesBufferedImage>();
//        resultImagesIdentifiers=new LinkedList<Long>();
//        bodyResultImages=new LinkedList<PrimeFacesBufferedImage>();
//        bodyResultImagesIdentifiers=new LinkedList<Long>(); 
//        chosenBustImage=null;
//        chosenBodyImage=null;
//        BufferedImageMaker imageMaker=new GeneralBufferedImageMaker();
//        BufferedImage originalSizeImage=imageMaker.getBufferedImageFromInputStream(event.getFile().getInputstream());
//        originalImage=new PrimeFacesBufferedImage(originalSizeImage);
//        Integer maxPixels=800;
//        originalImageResized=new PrimeFacesBufferedImage(this.getScaledImage(originalSizeImage,maxPixels));
//        originalImageFileName=ImageStoreHelper.storePrimeFacesBufferedImage(originalImageResized);
//    }
//    
//    
//    private BufferedImage getScaledImage(BufferedImage originalSizeImage, Integer maxPixels){
//        Integer originalWidt=new Integer(originalSizeImage.getWidth());
//        Integer originalHeigh=new Integer(originalSizeImage.getHeight());
//        Double originalWidth=originalWidt.doubleValue();
//        Double originalHeight=originalHeigh.doubleValue();
//        Double ratio=originalWidth/originalHeight;
//        Integer resWidth=null;
//        Integer resHeight=null;
//        if(ratio>1){
//            resWidth=maxPixels;
//            resHeight=(int)Math.ceil(maxPixels/ratio);
//        }
//        else{
//           resHeight=maxPixels;
//            resWidth=(int)Math.ceil(maxPixels*ratio); 
//        }
//        BufferedImage scaledImage = new BufferedImage(resWidth, resHeight, BufferedImage.TYPE_3BYTE_BGR);
//        Graphics2D graphics2D = scaledImage.createGraphics();
//        graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
//        graphics2D.drawImage(originalSizeImage, 0, 0, resWidth, resHeight, null);
//        graphics2D.dispose();
//        return scaledImage;
//    }
//    
//    
//    private BufferedImage getScaledImageRespectingFormat(BufferedImage originalSizeImage, Integer maxPixels){
//        Integer originalWidt=new Integer(originalSizeImage.getWidth());
//        Integer originalHeigh=new Integer(originalSizeImage.getHeight());
//        Double originalWidth=originalWidt.doubleValue();
//        Double originalHeight=originalHeigh.doubleValue();
//        Double ratio=originalWidth/originalHeight;
//        Integer resWidth=null;
//        Integer resHeight=null;
//        if(ratio>1){
//            resWidth=maxPixels;
//            resHeight=(int)Math.ceil(maxPixels/ratio);
//        }
//        else{
//           resHeight=maxPixels;
//            resWidth=(int)Math.ceil(maxPixels*ratio); 
//        }
//        BufferedImage scaledImage = new BufferedImage(resWidth, resHeight, originalSizeImage.getType());
//        Graphics2D graphics2D = scaledImage.createGraphics();
//        graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
//        graphics2D.drawImage(originalSizeImage, 0, 0, resWidth, resHeight, null);
//        graphics2D.dispose();
//        return scaledImage;
//    }
//    
//    public String cropImageAndRedirect() throws IOException{
//        BufferedImage croppedImage=originalImageResized.getBufferedImage().getSubimage(x1, y1, cropWidth, cropHeight);
//        //Más adelante cambiar esto (resultImage por resultsImages) por una lista, y procesarla con un FOR
//        BufferedImage colorResultImage=new BufferedImage(croppedImage.getWidth(), croppedImage.getHeight(),BufferedImage.TYPE_3BYTE_BGR);
//        BufferedImage resultImage = new BufferedImage(croppedImage.getWidth(), croppedImage.getHeight(),BufferedImage.TYPE_BYTE_GRAY);  
//        Graphics g = resultImage.getGraphics(); 
//        Graphics g2 = colorResultImage.getGraphics();
//        g.drawImage(croppedImage, 0, 0, null);
//        g2.drawImage(croppedImage, 0, 0, null);
//        g.dispose();
//        g2.dispose();
//        bustCroppedImage=new PrimeFacesBufferedImage(getScaledImageRespectingFormat(colorResultImage, maxBustSize));
//        PrimeFacesBufferedImage pbi=new PrimeFacesBufferedImage(getScaledImage(resultImage, maxBustSize));
//        resultImages.add(pbi);
//        resultImagesIdentifiers.add(pbi.getIdentifier());
//        return null;
//    }
//    
//    public String cropBodyImageAndRedirect() throws IOException{
//        getBodyResultImages().clear();
//        getBodyResultImagesIdentifiers().clear();
//        BufferedImage croppedImage=originalImageResized.getBufferedImage().getSubimage(x1, y1, cropWidth, cropHeight);
//        BufferedImage resultImage =  new BufferedImage(croppedImage.getWidth(),croppedImage.getHeight(), BufferedImage.TYPE_INT_RGB );
//	Graphics g = resultImage.getGraphics();
//	g.drawImage(croppedImage, 0, 0, null);
//        //Más adelante cambiar esto (resultImage por resultsImages) por una lista, y procesarla con un FOR
//        //BufferedImage resultImage=ImageProcessorFactory.solidBackgroundColorSiluetedImage(croppedImage);
//        PrimeFacesBufferedImage pbi=new PrimeFacesBufferedImage(getScaledImageRespectingFormat(resultImage, maxBodySize));
//        bodyCroppedImage=pbi;
//        getBodyResultImages().add(pbi);
//        getBodyResultImagesIdentifiers().add(pbi.getIdentifier());
//        return null;
//    }
//    /*Los métodos ChooseImage se pueden refactorizar de la siguiente manera
//     * Sigue igual que ahora, pero le entra un parámetro por context diciendo si es de tipo bust o body
//     * Lo dejamos para más adelante.
//     */
//    public String chooseImage() throws IOException, URISyntaxException{
//        FacesContext context = FacesContext.getCurrentInstance();
//        String id = context.getExternalContext().getRequestParameterMap().get("chosenid");
//        Long ident=(Long.valueOf(id));
//        PrimeFacesBufferedImage res=null;
//        for(PrimeFacesBufferedImage pf:resultImages){
//            if(pf.getIdentifier().equals(ident)){
//                res=pf;
//            }
//        }
//        chosenBustImage=res;
//        resultImages.clear();
//        resultImagesIdentifiers.clear();
//        EditCandidateBean bean = (EditCandidateBean) context.getApplication().evaluateExpressionGet(context, "#{editCandidateBean}", EditCandidateBean.class);
//        bean.setChosenColorBustImage(getBustCroppedImage());
//        bean.setChosenBustImage(chosenBustImage);
//        return null;
//    }
//    
//    public String chooseBodyImage() throws IOException, URISyntaxException{
//        FacesContext context = FacesContext.getCurrentInstance();
//        String id = context.getExternalContext().getRequestParameterMap().get("chosenid");
//        Long ident=(Long.valueOf(id));
//        PrimeFacesBufferedImage res=null;
//        for(PrimeFacesBufferedImage pf:getBodyResultImages()){
//            if(pf.getIdentifier().equals(ident)){
//                res=pf;
//            }
//        }
//        chosenBodyImage=res;
//        bodyResultImages.clear();
//        bodyResultImagesIdentifiers.clear();
//        EditCandidateBean bean = (EditCandidateBean) context.getApplication().evaluateExpressionGet(context, "#{editCandidateBean}", EditCandidateBean.class);
//        bean.setChosenBodyImage(chosenBodyImage);
//        return null;
//    }
//    
//    /**
//     * @return the originalImage
//     */
//    public PrimeFacesBufferedImage getOriginalImage() {
//        return originalImage;
//    }
//
//    /**
//     * @param originalImage the originalImage to set
//     */
//    public void setOriginalImage(PrimeFacesBufferedImage originalImage) {
//        this.originalImage = originalImage;
//    }
//
//    /**
//     * @return the originalImageResized
//     */
//    public PrimeFacesBufferedImage getOriginalImageResized() {
//        return originalImageResized;
//    }
//
//    /**
//     * @param originalImageResized the originalImageResized to set
//     */
//    public void setOriginalImageResized(PrimeFacesBufferedImage originalImageResized) {
//        this.originalImageResized = originalImageResized;
//    }
//    /**
//     * @return the originalImageFile
//     */
//    public UploadedFile getOriginalImageFile() {
//        return originalImageFile;
//    }
//
//    /**
//     * @param originalImageFile the originalImageFile to set
//     */
//    public void setOriginalImageFile(UploadedFile originalImageFile) {
//        this.originalImageFile = originalImageFile;
//    }
//
//    /**
//     * @return the x1
//     */
//    public Integer getX1() {
//        return x1;
//    }
//
//    /**
//     * @param x1 the x1 to set
//     */
//    public void setX1(Integer x1) {
//        this.x1 = x1;
//    }
//
//    /**
//     * @return the y1
//     */
//    public Integer getY1() {
//        return y1;
//    }
//
//    /**
//     * @param y1 the y1 to set
//     */
//    public void setY1(Integer y1) {
//        this.y1 = y1;
//    }
//
//    /**
//     * @return the x2
//     */
//    public Integer getX2() {
//        return x2;
//    }
//
//    /**
//     * @param x2 the x2 to set
//     */
//    public void setX2(Integer x2) {
//        this.x2 = x2;
//    }
//
//    /**
//     * @return the y2
//     */
//    public Integer getY2() {
//        return y2;
//    }
//
//    /**
//     * @param y2 the y2 to set
//     */
//    public void setY2(Integer y2) {
//        this.y2 = y2;
//    }
//
//    /**
//     * @return the cropWidth
//     */
//    public Integer getCropWidth() {
//        return cropWidth;
//    }
//
//    /**
//     * @param cropWidth the cropWidth to set
//     */
//    public void setCropWidth(Integer cropWidth) {
//        this.cropWidth = cropWidth;
//    }
//
//    /**
//     * @return the cropHeight
//     */
//    public Integer getCropHeight() {
//        return cropHeight;
//    }
//
//    /**
//     * @param cropHeight the cropHeight to set
//     */
//    public void setCropHeight(Integer cropHeight) {
//        this.cropHeight = cropHeight;
//    }
//
//    /**
//     * @return the resultImages
//     */
//    public List<PrimeFacesBufferedImage> getResultImages() {
//        return resultImages;
//    }
//
//    /**
//     * @param resultImages the resultImages to set
//     */
//    public void setResultImages(List<PrimeFacesBufferedImage> resultImages) {
//        this.resultImages = resultImages;
//    }
//
//    /**
//     * @return the numberOfResultColumns
//     */
//    
//    //De la misma manera podemos meter parametro aqui
//    public Integer getNumberOfResultColumns() {
//        return Math.min(resultImages.size(), 4);
//    }
//    
//    public Integer getNumberOfBodyResultColumns() {
//        return Math.min(bodyResultImages.size(), 4);
//    }
//
//    /**
//     * @return the resultImagesIdentifiers
//     */
//    public List<Long> getResultImagesIdentifiers() {
//        return resultImagesIdentifiers;
//    }
//
//    /**
//     * @param resultImagesIdentifiers the resultImagesIdentifiers to set
//     */
//    public void setResultImagesIdentifiers(List<Long> resultImagesIdentifiers) {
//        this.resultImagesIdentifiers = resultImagesIdentifiers;
//    }
//    
//    public StreamedContent getImageFromIdentifier() throws IOException{
//        FacesContext context = FacesContext.getCurrentInstance();
//
//        if (context.getRenderResponse()) {
//            // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL.
//            return new DefaultStreamedContent();
//        }
//        else {
//            // So, browser is requesting the image. Get ID value from actual request param.
//            String id = context.getExternalContext().getRequestParameterMap().get("id");
//            Long ident=(Long.valueOf(id));
//            PrimeFacesBufferedImage res=null;
//            for(PrimeFacesBufferedImage pf:resultImages){
//                if(pf.getIdentifier().equals(ident)){
//                    res=pf;
//                }
//            }
//            return res.getStreamedContentBufferedImage();
//        }
//    }
//    
//    public StreamedContent getBodyImageFromIdentifier() throws IOException{
//        FacesContext context = FacesContext.getCurrentInstance();
//
//        if (context.getRenderResponse()) {
//            // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL.
//            return new DefaultStreamedContent();
//        }
//        else {
//            // So, browser is requesting the image. Get ID value from actual request param.
//            String id = context.getExternalContext().getRequestParameterMap().get("id");
//            Long ident=(Long.valueOf(id));
//            PrimeFacesBufferedImage res=null;
//            for(PrimeFacesBufferedImage pf:bodyResultImages){
//                if(pf.getIdentifier().equals(ident)){
//                    res=pf;
//                }
//            }
//            return res.getStreamedContentBufferedImage();
//        }
//    }
//
//    /**
//     * @return the chosenBustImage
//     */
//    public PrimeFacesBufferedImage getChosenBustImage() {
//        return chosenBustImage;
//    }
//
//    /**
//     * @param chosenBustImage the chosenBustImage to set
//     */
//    public void setChosenBustImage(PrimeFacesBufferedImage chosenBustImage) {
//        this.chosenBustImage = chosenBustImage;
//    }
//
//    /**
//     * @return the chosenBodyImage
//     */
//    public PrimeFacesBufferedImage getChosenBodyImage() {
//        return chosenBodyImage;
//    }
//
//    /**
//     * @param chosenBodyImage the chosenBodyImage to set
//     */
//    public void setChosenBodyImage(PrimeFacesBufferedImage chosenBodyImage) {
//        this.chosenBodyImage = chosenBodyImage;
//    }
//
//    /**
//     * @return the bodyResultImages
//     */
//    public List<PrimeFacesBufferedImage> getBodyResultImages() {
//        return bodyResultImages;
//    }
//
//    /**
//     * @param bodyResultImages the bodyResultImages to set
//     */
//    public void setBodyResultImages(List<PrimeFacesBufferedImage> bodyResultImages) {
//        this.bodyResultImages = bodyResultImages;
//    }
//
//    /**
//     * @return the bodyResultImagesIdentifiers
//     */
//    public List<Long> getBodyResultImagesIdentifiers() {
//        return bodyResultImagesIdentifiers;
//    }
//
//    /**
//     * @param bodyResultImagesIdentifiers the bodyResultImagesIdentifiers to set
//     */
//    public void setBodyResultImagesIdentifiers(List<Long> bodyResultImagesIdentifiers) {
//        this.bodyResultImagesIdentifiers = bodyResultImagesIdentifiers;
//    }
//
//    /**
//     * @return the bodyCroppedImage
//     */
//    public PrimeFacesBufferedImage getBodyCroppedImage() {
//        return bodyCroppedImage;
//    }
//
//    /**
//     * @param bodyCroppedImage the bodyCroppedImage to set
//     */
//    public void setBodyCroppedImage(PrimeFacesBufferedImage bodyCroppedImage) {
//        this.bodyCroppedImage = bodyCroppedImage;
//    }
//
//    /**
//     * @return the bustCroppedImage
//     */
//    public PrimeFacesBufferedImage getBustCroppedImage() {
//        return bustCroppedImage;
//    }
//
//    /**
//     * @param bustCroppedImage the bustCroppedImage to set
//     */
//    public void setBustCroppedImage(PrimeFacesBufferedImage bustCroppedImage) {
//        this.bustCroppedImage = bustCroppedImage;
//    }
//
//    /**
//     * @return the originalImageFileName
//     */
//    public String getOriginalImageFileName() {
//        return originalImageFileName;
//    }
//
//    /**
//     * @param originalImageFileName the originalImageFileName to set
//     */
//    public void setOriginalImageFileName(String originalImageFileName) {
//        this.originalImageFileName = originalImageFileName;
//    }
//
//}
//
